package slxy.jiangtao.dts.core.common.dao;

import slxy.jiangtao.dts.core.common.hibernate.qbc.CriteriaQuery;
import slxy.jiangtao.dts.core.common.hibernate.qbc.HqlQuery;
import slxy.jiangtao.dts.core.common.hibernate.qbc.Page;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface IGenericBaseCommonDao {

  public <T> Serializable save(T entity);

  public <T> void evict(T entity);

  public <T> void batchSave(List<T> entitys);

  public <T> void saveOrUpdate(T entity);

  /**
   * 删除实体
   *
   * @param <T>
   * @param <T>
   * @param <T>
   * @param entitie
   */
  public <T> void delete(T entitie);

  /**
   * 根据实体名称和主键获取实体
   *
   * @param <T>
   * @param entityName
   * @param id
   * @return
   */
  public <T> T get(Class<T> entityName, Serializable id);

  /**
   * 根据实体名字获取唯一记录
   *
   * @param propertyName
   * @param value
   * @return
   */
  public <T> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value);

  /** 按属性查找对象列表. */
  public <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);

  /**
   * 加载全部实体
   *
   * @param <T>
   * @param entityClass
   * @return
   */
  public <T> List<T> loadAll(final Class<T> entityClass);

  /**
   * 根据实体名称和主键获取实体
   *
   * @param <T>
   * @param <T>
   * @param entityName
   * @param id
   * @return
   */
  public <T> T getEntity(Class entityName, Serializable id);

  public <T> void deleteEntityById(Class entityName, Serializable id);

  /**
   * 删除实体集合
   *
   * @param <T>
   * @param entities
   */
  public <T> void deleteAllEntitie(Collection<T> entities);

  /**
   * 更新指定的实体
   *
   * @param <T>
   * @param pojo
   */
  public <T> void updateEntitie(T pojo);

  public <T> void updateEntityById(Class entityName, Serializable id);

  /**
   * 通过hql 查询语句查找对象
   *
   * @param <T>
   * @param hql
   * @return
   */
  public <T> List<T> findByQueryString(String hql);

  /**
   * 通过hql查询唯一对象
   *
   * @param <T>
   * @return
   */
  public <T> T singleResult(String hql);

  /**
   * 根据sql更新
   *
   * @return
   */
  public int updateBySqlString(String sql);

  /**
   * 根据sql查找List
   *
   * @param <T>
   * @param query
   * @return
   */
  public <T> List<T> findListbySql(String query);

  /**
   * 通过属性称获取实体带排序
   *
   * @param entityClass
   * @param propertyName
   * @param value
   * @param isAsc
   * @param <T>
   * @return
   */
  public <T> List<T> findByPropertyisOrder(
          Class<T> entityClass, String propertyName, Object value, boolean isAsc);

  /**
   * cq方式分页
   *
   * @param cq
   * @param isOffset
   * @return
   */
  public Page getPageList(final CriteriaQuery cq, final boolean isOffset);

  /**
   * 通过cq获取全部实体
   *
   * @param <T>
   * @param cq
   * @return
   */
  public <T> List<T> getListByCriteriaQuery(final CriteriaQuery cq, Boolean ispage);

  /**
   * hqlQuery方式分页
   *
   * @param hqlQuery
   * @param needParameter
   * @return
   */
  public Page getPageList(final HqlQuery hqlQuery, final boolean needParameter);

  public Session getSession();

  public List findByExample(final String entityName, final Object exampleEntity);

  /**
   * 通过hql 查询语句查找HashMap对象
   *
   * @param query
   * @return
   */
  public Map<Object, Object> getHashMapbyQuery(String query);

  /** 执行SQL */
  public Integer executeSql(String sql, List<Object> param);

  /** 执行SQL */
  public Integer executeSql(String sql, Object... param);

  /** 执行SQL 使用:name占位符 */
  public Integer executeSql(String sql, Map<String, Object> param);
  /** 执行SQL 使用:name占位符,并返回插入的主键值 */
  public Object executeSqlReturnKey(String sql, Map<String, Object> param);

  /** 使用指定的检索标准检索数据并分页返回数据For JDBC */
  public Long getCountForJdbc(String sql);

  /** 使用指定的检索标准检索数据并分页返回数据For JDBC-采用预处理方式 */
  public Long getCountForJdbcParam(String sql, Object[] objs);

  /**
   * 通过hql 查询语句查找对象
   *
   * @param hql
   * @param param
   * @param <T>
   * @return
   */
  public <T> List<T> findHql(String hql, Object... param);

  /**
   * 执行HQL语句操作更新
   *
   * @param hql
   * @return
   */
  public Integer executeHql(String hql);

  public <T> List<T> pageList(DetachedCriteria dc, int firstResult, int maxResult);

  public <T> List<T> findByDetached(DetachedCriteria dc);

  /**
   * 执行存储过程
   *
   * @param procedureSql
   * @param params
   * @param <T>
   * @return
   */
  public <T> List<T> executeProcedure(String procedureSql, Object... params);


  /***
   * 利用原生sql返回List<Map>
   * @param sql
   * @return
   */
  public <T> List<T> findListMapBySql(String sql);
}
